home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / ixemul / gen_glue.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  2KB  |  93 lines

  1. #include <sys/types.h>
  2. #include <sys/syscall.h>
  3.  
  4. #include <stdio.h>
  5.  
  6. struct syscall {
  7.   char *name;
  8.   int   vec;
  9. } syscalls[] = {
  10. #define SYSTEM_CALL(func,vec) { #func, vec},
  11. #include <sys/syscall.def>
  12. #undef SYSTEM_CALL
  13. };
  14.  
  15. int nsyscall = sizeof(syscalls) / sizeof (syscalls[0]);
  16.  
  17. #define BASEREL                         \
  18. "\txref\t_ixemulbase\n\txdef\t_%s\n_%s\n\tmove.l\t_ixemulbase(a4),a0\n\tjmp\t%d(a0)\n"
  19.  
  20. #define BASEREL_IX_GETA4                \
  21. "\txref\t_ixemulbase\n\txdef\t_%s\n_%s\n\tmove.l\t_ixemulbase,a0\n\tjmp\t%d(a0)\n"
  22.  
  23. #define NOBASEREL                       \
  24. "\txref\t_ixemulbase\n\txdef\t_%s\n_%s\n\tmove.l\t_ixemulbase,a0\n\tjmp\t%d(a0)\n"
  25.  
  26. #define PROFILING                       \
  27. "\txref\t_ixemulbase\n\txdef\t_%s\n_%s\n\tsection\t\"DATA\",data\nPROF%s\n\tdc.l\t0\
  28. \tsection\t\"CODE\",code\n\tlink\ta5,#0\n\tlea\tPROF%s,a0\n\tjsr\tmcount\n\
  29. \tunlk\ta5\n\tmove.l\t_ixemulbase,a0\n\tjmp\t%d(a0)\n"
  30.  
  31. void usage(void)
  32. {
  33.   fprintf(stderr, "Usage: gen_glue baserel | no-baserel | profiling\n");
  34.   exit(1);
  35. }
  36.  
  37. int main(int argc, char **argv)
  38. {
  39.   FILE *fp;
  40.   struct syscall *sc;
  41.   int i, v, baserel = 0, profiling = 0;
  42.  
  43.   if (argc != 2)
  44.     usage();
  45.   if (!strcmp(argv[1], "baserel"))
  46.     {
  47.       baserel = 1; profiling = 0;
  48.     }
  49.   else if (!strcmp(argv[1], "no-baserel"))
  50.     {
  51.       baserel = 0; profiling = 0;
  52.     }
  53.   else if (!strcmp(argv[1], "profiling"))
  54.     {
  55.       baserel = 0; profiling = 1;
  56.     }
  57.   else usage();
  58.  
  59.   for (i = 0, sc = syscalls; i < nsyscall; i++, sc++)
  60.     {
  61.       char name[strlen (sc->name) + 3];
  62.  
  63.       if (!memcmp(sc->name, "__obsolete", 10))
  64.         continue;
  65.       if (!memcmp(sc->name, "__must_recompile", 16))
  66.         continue;
  67.       if (!memcmp(sc->name, "__stk", 5))
  68.         continue;
  69.       v = -(sc->vec + 4)*6;
  70.       sprintf (name, "%s.s", sc->name);
  71.  
  72.       fp = fopen (name, "w");
  73.  
  74.       if (!fp)
  75.         {
  76.           perror (sc->name);
  77.           exit (20);
  78.         }
  79.  
  80.       if (baserel)
  81.         if (sc->vec == SYS_ix_geta4)
  82.           fprintf (fp, BASEREL_IX_GETA4, sc->name, sc->name, v);
  83.         else
  84.           fprintf (fp, BASEREL, sc->name, sc->name, v);
  85.       else if (profiling)
  86.         fprintf (fp, PROFILING, sc->name, sc->name, sc->name, sc->name, v);
  87.       else
  88.         fprintf (fp, NOBASEREL, sc->name, sc->name, v);
  89.       fclose (fp);
  90.     }
  91.   return (0);
  92. }
  93.